package com.xbongbong.pay.platform.wechatpay.pojo.response;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 申请退款
 * @author 魏荣杰
 * @date 2021/2/2 15:21
 * @since
 * @version
 */
@Setter
@Getter
public class WeChatApplyRefundResponse extends WeChatBaseResponse{
    private static final long serialVersionUID = -2751196232055732619L;

    /**
     * 微信支付退款号。
     * 示例值：50000000382019052709732678859
     */
    @NotNull
    @Size(min = 1, max = 32)
    @JSONField(name = "refund_id")
    private String refundId;

    /**
     * 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
     * 示例值：1217752501201407033233368018
     */
    @NotNull
    @Size(min = 1, max = 64)
    @JSONField(name = "out_refund_no")
    private String outRefundNo;

    /**
     * 微信支付交易订单号。
     * 示例值：1217752501201407033233368018
     */
    @NotNull
    @Size(min = 1, max = 32)
    @JSONField(name = "transaction_id")
    private String transactionId;

    /**
     * 原支付交易对应的商户订单号。
     * 示例值：1217752501201407033233368018
     */
    @NotNull
    @Size(min = 1, max = 32)
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 枚举值：
     * ORIGINAL：原路退款
     * BALANCE：退回到余额
     * OTHER_BALANCE：原账户异常退到其他余额账户
     * OTHER_BANKCARD：原银行卡异常退到其他银行卡
     * 示例值：ORIGINAL
     */
    @NotNull
    @Size(min = 1, max = 16)
    private String channel;

    /**
     * 取当前退款单的退款入账方，有以下几种情况：
     * 1）退回银行卡：{银行名称}{卡类型}{卡尾号}
     * 2）退回支付用户零钱：支付用户零钱
     * 3）退还商户：商户基本账户商户结算银行账户
     * 4）退回支付用户零钱通：支付用户零钱通。
     * 示例值：招商银行信用卡0403
     */
    @NotNull
    @Size(min = 1, max = 64)
    @JSONField(name = "user_received_account")
    private String userReceivedAccount;

    /**
     * 退款成功时间，当退款状态为退款成功时有返回。遵循rfc3339标准格式，格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE，YYYY-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日13点29分35秒。
     * 示例值：2020-12-01T16:18:12+08:00
     */
    @Size(min = 1, max = 64)
    @JSONField(name = "success_time")
    private String successTime;
    /**
     * 退款受理时间。 遵循rfc3339标准格式，格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE，YYYY-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日13点29分35秒。
     * 示例值：2020-12-01T16:18:12+08:00
     */
    @NotNull
    @Size(min = 1, max = 64)
    @JSONField(name = "create_time")
    private String createTime;
    /**
     * 退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，可前往商户平台-交易中心，手动处理此笔退款。
     * 枚举值：
     * SUCCESS：退款成功
     * CLOSED：退款关闭
     * PROCESSING：退款处理中
     * ABNORMAL：退款异常
     * 示例值：SUCCESS
     */
    @NotNull
    @Size(min = 1, max = 32)
    private String status;

    /**
     * 退款所使用资金对应的资金账户类型。 枚举值：
     * UNSETTLED : 未结算资金
     * AVAILABLE : 可用余额
     * UNAVAILABLE : 不可用余额
     * OPERATION : 运营户
     * 示例值：UNSETTLED
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "funds_account")
    private String fundsAccount;

    /**
     * 金额详细信息
     */
    @NotNull
    @Valid
    private Amount amount;

    /**
     * 	优惠退款信息。
     */
    @JSONField(name = "promotion_detail")
    @Valid
    private List<PromotionDetail> promotionDetail;

    @Setter
    @Getter
    public static class Amount {
        /**
         * 订单总金额，单位为分。
         * 示例值：100
         */
        @NotNull
        private Integer total;
        /**
         * 退款标价金额，单位为分，可以做部分退款。
         * 示例值：100
         */
        @NotNull
        private Integer refund;
        /**
         * 现金支付金额，单位为分，只能为整数。
         * 示例值：90
         */
        @NotNull
        private Integer payerTotal;
        /**
         * 退款给用户的金额，不包含所有优惠券金额。
         * 示例值：90
         */
        @NotNull
        private Integer payerRefund;
        /**
         * 去掉非充值代金券退款金额后的退款金额，单位为分，退款金额=申请退款金额-非充值代金券退款金额，退款金额<=申请退款金额。
         * 示例值：100
         */
        @NotNull
        private Integer settlementRefund;
        /**
         * 应结订单金额=订单金额-免充值代金券金额，应结订单金额<=订单金额，单位为分。
         * 示例值：100
         */
        @NotNull
        private Integer settlementTotal;
        /**
         * 优惠退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠，单位为分。
         * 示例值：10
         */
        @NotNull
        private Integer discountRefund;
        /**
         * 符合ISO 4217标准的三位字母代码，目前只支持人民币：CNY。
         * 示例值：CNY
         */
        @NotNull
        private String currency;
    }

    @Setter
    @Getter
    public static class PromotionDetail {
        /**
         * 券或者立减优惠id。
         * 示例值：109519
         */
        @NotNull
        @Size(min = 1, max = 32)
        @JSONField(name = "promotion_id")
        private String promotionId;

        /**
         * 枚举值：
         * GLOBAL：全场代金券
         * SINGLE：单品优惠
         * 示例值：SINGLE
         */
        @NotNull
        @Size(min = 1, max = 32)
        private String scope;

        /**
         * 枚举值：
         * COUPON：代金券，需要走结算资金的充值型代金券
         * DISCOUNT：优惠券，不走结算资金的免充值型优惠券
         * 示例值：DISCOUNT
         */
        @NotNull
        @Size(min = 1, max = 32)
        private String type;
        /**
         * 用户享受优惠的金额（优惠券面额=微信出资金额+商家出资金额+其他出资方金额 ），单位为分。
         * 示例值：5
         */
        @NotNull
        private Integer amount;
        /**
         * 优惠退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为用户支付的现金，说明详见代金券或立减优惠，单位为分。
         * 示例值：100
         */
        @NotNull
        @JSONField(name = "refund_amount")
        private Integer refundAmount;

        /**
         * 优惠商品发生退款时返回商品信息。
         */
        @JSONField(name = "goods_detail")
        @Valid
        private List<GoodsDetail> goodsDetail;

        @Setter
        @Getter
        public static class GoodsDetail {
            /**
             * 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
             * 示例值：1217752501201407033233368018
             */
            @NotNull
            @Size(min = 1, max = 32)
            @JSONField(name = "merchant_goods_id")
            private String merchantGoodsId;
            /**
             * 微信支付定义的统一商品编号（没有可不传）。
             * 示例值：1001
             */
            @Size(min = 1, max = 32)
            @JSONField(name = "wechatpay_goods_id")
            private String wechatpayGoodsId;
            /**
             * 商品的实际名称。
             * 示例值：iPhone6s 16G
             */
            @Size(min = 1, max = 256)
            @JSONField(name = "goods_name")
            private String goodsName;
            /**
             * 商品单价金额，单位为分。
             * 示例值：528800
             */
            @NotNull
            @JSONField(name = "unit_price")
            private Integer unitPrice;
            /**
             * 商品退款金额，单位为分。
             * 示例值：528800
             */
            @NotNull
            @JSONField(name = "refund_amount")
            private Integer refundAmount;
            /**
             * 单品的退款数量。
             * 示例值：1
             */
            @NotNull
            @JSONField(name = "refund_quantity")
            private Integer refundQuantity;
        }
    }
}
